package com.hsylient.javase.chapter09;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class TestForEach {

    /**
     * 在list进行forEach循环的时候，实际上是多线程在操作。
     * 如果我们在循环外面定义了变量
     *     要不就设置为final（没有意义）
     *     要不就设置为原子类（推荐）
     */
    @Test
    public void testErrorForEach() {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        int sum = 0;

        // java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
        numbers.forEach(number -> {
//            sum += number;  // 编译警告，sum 需要是 final 或等效 final 的
        });

        System.out.println(sum);
    }

    @Test
    public void testForEach() {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        AtomicInteger sum = new AtomicInteger(0);

        numbers.forEach(sum::addAndGet);

        System.out.println(sum);
    }
}
